package com.mxl.rabbitmq.controller;

import com.mxl.rabbitmq.config.JavaBoyConfig;
import com.mxl.rabbitmq.model.MessageBody;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * 拉模式获取消息
 * @author MXL
 * @date 2021/9/14 0014
 **/
@RestController
@Slf4j
public class ReceiveMsgController {

    @Autowired
    RabbitTemplate rabbitTemplate;

    /**
     * 调用 receiveAndConvert 方法，方法参数为队列名称，方法执行完成后，会从 MQ 上拉取一条消息下来，如果该方法返回值为 null，表示该队列上没有消息了。
     * receiveAndConvert 方法有一个重载方法，可以在重载方法中传入一个等待超时时间，例如 3 秒。此时，假设队列中没有消息了，则 receiveAndConvert 方法会阻塞 3 秒，
     * 3 秒内如果队列中有了新消息就返回，3 秒后如果队列中还是没有新消息，就返回 null，这个等待超时时间要是不设置的话，默认为 0。
     * 这是消息两种不同的消费模式。
     *
     * 如果需要从消息队列中持续获得消息，就可以使用推模式；如果只是单纯的消费一条消息，则使用拉模式即可。切忌将拉模式放到一个死循环中，变相的订阅消息，这会严重影响 RabbitMQ 的性能。
     *
     * @return
     */
    @RequestMapping("/receiveJavaBoyMsg")
    public List<Object> receiveJavaBoyMsg() throws UnsupportedEncodingException {
        MessageBody messageBody = (MessageBody) rabbitTemplate.receiveAndConvert(JavaBoyConfig.JAVABOY_QUEUE_NAME);
        log.info("messageBody: {}", messageBody.toString());
//        log.info("messageBody: {}", new String(((byte[]) o),"UTF-8"));
        List<Object> oList = new ArrayList<>();
        oList.add(messageBody);
        //故意设置的异常, 当出现异常, 消息会重新回到队列当中, 等待下一次被消费
        int i = 1 / 0;
        return oList;
    }



}
